﻿// using System.Net;
// using System.Text;
// using System.Text.Json;
//
// namespace OpenAIProxy;
//
// // 流式响应处理器增强版
// public class StreamResponseHandler : DelegatingHandler
// {
//     private readonly ILogger<StreamResponseHandler> _logger;
//     private readonly IStorageService _storageService;
//     private readonly TokenAccumulator _tokenAccumulator;
//     private readonly IAuditLogger _auditLogger;
//
//     public StreamResponseHandler(
//         ILogger<StreamResponseHandler> logger,
//         IStorageService storageService,
//         TokenAccumulator tokenAccumulator,
//         IAuditLogger auditLogger)
//     {
//         _logger = logger;
//         _storageService = storageService;
//         _tokenAccumulator = tokenAccumulator;
//         _auditLogger = auditLogger;
//     }
//
//     protected override async Task<HttpResponseMessage> SendAsync(
//         HttpRequestMessage request, 
//         CancellationToken cancellationToken)
//     {
//         var requestId = Guid.NewGuid().ToString();
//         request.Headers.Add("X-Request-Id", requestId);
//         
//         var response = await base.SendAsync(request, cancellationToken);
//
//         if (!response.IsSuccessStatusCode || 
//             response.Content?.Headers?.ContentType?.MediaType != "text/event-stream")
//         {
//             return response;
//         }
//
//         // 创建捕获流
//         var capturedStream = new MemoryStream();
//         var contentBuilder = new StringBuilder();
//         
//         // 覆盖响应内容
//         var originalStream = await response.Content.ReadAsStreamAsync(cancellationToken);
//         response.Content = new StreamingCaptureContent(
//             originalStream, 
//             capturedStream,
//             contentBuilder,
//             _tokenAccumulator,
//             _auditLogger,
//             requestId
//         );
//
//         return response;
//     }
//
//     // 流式捕获内容类
//     private class StreamingCaptureContent : StreamContent
//     {
//         private readonly Stream _innerStream;
//         private readonly MemoryStream _captureStream;
//         private readonly StringBuilder _contentBuilder;
//         private readonly TokenAccumulator _tokenAccumulator;
//         private readonly IAuditLogger _auditLogger;
//         private readonly string _requestId;
//
//         public StreamingCaptureContent(
//             Stream innerStream,
//             MemoryStream captureStream,
//             StringBuilder contentBuilder,
//             TokenAccumulator tokenAccumulator,
//             IAuditLogger auditLogger,
//             string requestId)
//             : base(innerStream)
//         {
//             _innerStream = innerStream;
//             _captureStream = captureStream;
//             _contentBuilder = contentBuilder;
//             _tokenAccumulator = tokenAccumulator;
//             _auditLogger = auditLogger;
//             _requestId = requestId;
//         }
//
//         protected override async Task SerializeToStreamAsync(Stream stream, TransportContext? context)
//         {
//             var buffer = new byte[4096];
//             int bytesRead;
//             
//             await _auditLogger.BeginRequestLog(_requestId, "Stream started");
//             
//             // 同时向捕获流和输出流写入
//             while ((bytesRead = await _innerStream.ReadAsync(buffer, 0, buffer.Length)) > 0)
//             {
//                 // 写入原始响应流（转发给客户端）
//                 await stream.WriteAsync(buffer, 0, bytesRead);
//                 await stream.FlushAsync();
//                 
//                 // 写入捕获流用于存储
//                 await _captureStream.WriteAsync(buffer, 0, bytesRead);
//                 
//                 // 处理内容块
//                 await ProcessChunk(buffer, bytesRead);
//             }
//             
//             await FinalizeLogging();
//         }
//
//         private async Task ProcessChunk(byte[] buffer, int bytesRead)
//         {
//             try
//             {
//                 var chunk = Encoding.UTF8.GetString(buffer, 0, bytesRead);
//                 _contentBuilder.Append(chunk);
//                 
//                 // 提取纯内容块
//                 var contentChunks = ParseSSEChunk(chunk);
//                 foreach (var contentChunk in contentChunks)
//                 {
//                     // 累加token计数
//                     _tokenAccumulator.AddContent(contentChunk);
//                     
//                     // 记录到审计日志
//                     await _auditLogger.AppendContent(_requestId, contentChunk);
//                     
//                     _logger.LogTrace($"Received chunk: {contentChunk}");
//                 }
//             }
//             catch (Exception ex)
//             {
//                 _logger.LogError(ex, "Error processing streaming chunk");
//             }
//         }
//
//         private async Task FinalizeLogging()
//         {
//             try
//             {
//                 // 保存完整响应内容
//                 _captureStream.Seek(0, SeekOrigin.Begin);
//                 var reader = new StreamReader(_captureStream);
//                 var fullContent = await reader.ReadToEndAsync();
//                 
//                 // 解析最终响应对象
//                 var finalResponse = ExtractFinalResponse(_contentBuilder.ToString());
//                 
//                 // 记录完成
//                 await _auditLogger.FinalizeRequest(
//                     _requestId, 
//                     _contentBuilder.ToString(),
//                     fullContent,
//                     _tokenAccumulator.TotalTokens
//                 );
//             }
//             catch (Exception ex)
//             {
//                 _logger.LogError(ex, "Error finalizing streaming log");
//             }
//         }
//
//         private List<string> ParseSSEChunk(string chunk)
//         {
//             var results = new List<string>();
//             var lines = chunk.Split('\n');
//             
//             foreach (var line in lines)
//             {
//                 if (line.StartsWith("data: ") && !line.Contains("[DONE]"))
//                 {
//                     var dataLine = line.Substring(5).Trim();
//                     
//                     try
//                     {
//                         if (!string.IsNullOrWhiteSpace(dataLine))
//                         {
//                             var jsonObj = JsonSerializer.Deserialize<JsonElement>(dataLine);
//                             // 提取choices[0].delta.content节点
//                             if (jsonObj.TryGetProperty("choices", out var choices) &&
//                                 choices.GetArrayLength() > 0 &&
//                                 choices[0].TryGetProperty("delta", out var delta) &&
//                                 delta.TryGetProperty("content", out var contentProp))
//                             {
//                                 results.Add(contentProp.GetString() ?? "");
//                             }
//                         }
//                     }
//                     catch (JsonException) { /* 忽略非JSON数据 */ }
//                 }
//             }
//             
//             return results;
//         }
//
//         private OpenAIChatResponse? ExtractFinalResponse(string sseContent)
//         {
//             try
//             {
//                 // 找到最后一个有效信号
//                 var lastData = sseContent.Split(new[] {"data: "}, StringSplitOptions.RemoveEmptyEntries)
//                     .LastOrDefault(s => !string.IsNullOrWhiteSpace(s) && s != "[DONE]");
//                 
//                 if (lastData != null)
//                 {
//                     return JsonSerializer.Deserialize<OpenAIChatResponse>(
//                         lastData.Trim(), 
//                         new JsonSerializerOptions { PropertyNameCaseInsensitive = true }
//                     );
//                 }
//             }
//             catch (Exception ex)
//             {
//                 _logger.LogError(ex, "Error extracting final SSE response");
//             }
//             return null;
//         }
//     }
// }
